/****************************************************************************
 * Copyright 2009 Huascar A. Sanchez                                        *
 *                                                                          *
 * Licensed under the Apache License, Version 2.0 (the "License");          *
 * you may not use this file except in compliance with the License.         *
 * You may obtain a copy of the License at                                  *
 *                                                                          *
 *     http://www.apache.org/licenses/LICENSE-2.0                           *
 *                                                                          *
 * Unless required by applicable law or agreed to in writing, software      *
 * distributed under the License is distributed on an "AS IS" BASIS,        *
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
 * See the License for the specific language governing permissions and      *
 * limitations under the License.                                           *
 ****************************************************************************/
package com.gotobject.filter.spi;

import com.gotobject.filter.FilteringException;
import com.gotobject.filter.FilterImpl;
import com.gotobject.filter.common.Predicates;
import com.gotobject.filter.predicate.AbstractPredicate;
import com.gotobject.filter.predicate.Predicate;
import org.junit.Test;

import java.util.Arrays;
import java.util.Iterator;

/**
 * @author huascar.sanchez@gmail.com (Huascar A. Sanchez)
 */
public class FilteringTest {
    @Test(expected = UnsupportedOperationException.class)
    public void failedForIteratorElementDeletion() throws Exception {
        for(Iterator<Integer> itr = new FilteringImpl<Integer>(new FilterImpl()).filter(Predicates.all(), Arrays.asList(1, 2, 3)).iterator(); itr.hasNext();){
            itr.remove();
        }
    }

    @Test(expected = FilteringException.class)
    public void failedForFaultyCondition() throws Exception {
        final Predicate<Integer> c = new AbstractPredicate<Integer>(){
            @Override
            public boolean apply(Integer thing) {
                throw new RuntimeException("should failed gracefully");
            }
        };

        final FilterImpl f =  new FilterImpl();
        for(Integer each : new FilteringImpl<Integer>(f).filter(c, Arrays.asList(1, 2, 3))){
        }

        f.throwFailedFilteringExceptions();
    }
}
